home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / cmln0186.arc / ASSEMBL1.LTG < prev    next >
Text File  |  1986-12-20  |  20KB  |  439 lines

  1.  
  2.                             Listing 1
  3.  
  4. ;-------------------------------------------------------------------------------
  5. ;
  6. ;    video.asm                                        created 5-11-85
  7. ;
  8. ;    VIDEO ROUTINES
  9. ;    (C) COPYRIGHT 1985 BY THOMAS D. WEBB
  10. ;
  11. ;    ALL RIGHTS RESERVED.
  12. ;    PERMISSION IS GRANTED FOR UNLIMITED PERSONAL, NON-COMMERCIAL USE ONLY.
  13. ;
  14. ;-------------------------------------------------------------------------------
  15. TITLE              VIDEO
  16.                    NAME      VIDEO
  17.  
  18. BUFFER_SIZE        EQU       2000D    ;THE VIDEO BUFFER SIZE IN WORDS
  19. NUM_BYTES_IN_ROW   EQU       80       ;NUMBER OF BYTES IN A ROW
  20. MONOCHROME_SEGADR  EQU       0B000H   ;ADDRESS OF MONOCHROME BUFFER
  21. GRAPHICS_SEGADR    EQU       0B800H   ;ADDRESS OF GRAPHICS BUFFER
  22.  
  23. STACK              SEGMENT             PARA STACK 'STACK'
  24.                    DB                  64 DUP ('STACK   ')
  25. STACK              ENDS
  26.  
  27. PGROUP             GROUP     PROG
  28. PROG               SEGMENT   BYTE PUBLIC 'PROG'
  29.                    ASSUME    CS:PGROUP,SS:STACK
  30. ;-------------------------------------------------------------------------------
  31. ; CLEAR            (ROUTINE 1)
  32. ;      THIS ROUTINE CLEARS THE SCREEN
  33. ; THE C LANGUAGE CALL IS:
  34. ;      CLEAR();
  35. ; THE ASSEMBLY CALL IS:
  36. ;      CALL CLEAR
  37. ;-------------------------------------------------------------------------------
  38.                    PUBLIC    CLEAR
  39. CLEAR              PROC      NEAR
  40.                    PUSH      BP          ;THE FRAME POINTER
  41.                    MOV       AH,6        ;SCROLL ACTIVE PAGE UP
  42.                    MOV       AL,019H     ;CLEAR 25 LINES
  43.                    MOV       CX,0H       ;UPPER LEFT OF SCROLL
  44.                    MOV       DX,2479H    ;LOWER RIGHT OF SCROLL
  45.                    MOV       BH,7H       ;USE NORMAL ATTRIBUTE ON BLANKED LINE
  46.                    INT       10H         ;VIDEO-IO
  47.                    POP       BP          ;THE FRAME POINTER
  48.                    RET
  49. CLEAR              ENDP
  50.  
  51. ;-------------------------------------------------------------------------------
  52. ; LOCATE           (ROUTINE 2)
  53. ;        THIS ROUTINE WILL LOCATE THE CURSOR AT A ROW AND COLUMN ON THE SCREEN
  54. ; THE C LANGUAGE CALL IS:
  55. ;        LOCATE(ROW,COLUMN);
  56. ; THE ASSEMBLY CALL IS:
  57. ;        MOV    DX,COL     ;RANGE IS 0 - 79
  58. ;        PUSH   DX
  59. ;        MOV    DX,ROW     ;RANGE IS 0 - 24
  60. ;        PUSH   DX
  61. ;        CALL   LOCATE
  62. ;-------------------------------------------------------------------------------
  63.                    PUBLIC    LOCATE
  64. LOCATE             PROC      NEAR                ;PROC TO LOCATE THE CURSOR
  65.                    PUSH      BP                  ;THE FRAME POINTER
  66.                    MOV       BP,SP               ;POINT TO MOST RECENT STACK ELE
  67.                    MOV       DH,[BP+4]           ;GET THE ROW..
  68.                    MOV       DL,[BP+6]           ;..AND THE COL
  69.                    MOV       BH,0H               ;GRAPHICS PAGE NO.
  70.                    MOV       AH,2H               ;SET_CURSOR_POSITION
  71.                    INT       10H                 ;VIDEO-IO
  72.                    POP       BP                  ;THE FRAME POINTER
  73.                    RET
  74. LOCATE             ENDP
  75.  
  76. ;-------------------------------------------------------------------------------
  77. ; CURSIZE          (ROUTINE 3)
  78. ;        THIS ROUTINE SETS THE SIZE OF THE CURSOR
  79. ; THE C LANGUAGE CALL IS:
  80. ;        CURSIZE(START_LINE,STOP_LINE);
  81. ; THE ASSEMBLY CALL IS:
  82. ;        MOV    DX,STOP_LINE   ;13 IS NORMAL STOP_LINE FOR MONOCHROME ADAPTOR
  83. ;        PUSH   DX
  84. ;        MOV    DX,START_LINE  ;12 IS NORMAL START_LINE FOR MONOCHROME ADAPTOR
  85. ;        PUSH   DX
  86. ;        CALL   CURSIZE
  87. ;-------------------------------------------------------------------------------
  88.                    PUBLIC    CURSIZE
  89. CURSIZE            PROC      NEAR
  90.                    PUSH      BP                  ;THE FRAME POINTER
  91.                    MOV       BP,SP               ;POINT TO MOST RECENT STACK ELE
  92.                    MOV       CH,[BP+4]           ;CURSOR START LINE
  93.                    MOV       CL,[BP+6]           ;CURSOR STOP LINE
  94.                    MOV       AH,1H               ;SET CURSOR TYPE
  95.                    INT       10H                 ;VIDEO-IO
  96.                    POP       BP                  ;THE FRAME POINTER
  97.                    RET
  98. CURSIZE            ENDP
  99.  
  100. ;-------------------------------------------------------------------------------
  101. ; GET_MODE         (ROUTINE 4)
  102. ;     THIS ROUTINE RETURNS THE CRT MODE IN AL, AND THE NUMBER OF CHARACTER
  103. ;     COLUMNS ON THE SCREEN IN AH
  104. ; THE C LANGUAGE CALL IS: mode_area.value = get_mode();
  105. ;     WHERE mode_area is defined as:
  106. ; union
  107. ;   {
  108. ;    int value;
  109. ;    struct
  110. ;       {
  111. ;         char al;           /*al EQ 7 is monochrome*/
  112. ;         char ah;           /*number of character columns on the screen*/
  113. ;       } al_ah;
  114. ;   } mode_area;
  115. ;
  116. ; THE ASSEMBLY CALL IS:
  117. ;      CALL GET_MODE
  118. ;-------------------------------------------------------------------------------
  119.                    PUBLIC      GET_MODE
  120. GET_MODE           PROC        NEAR
  121.                    PUSH        BP           ;THE FRAME POINTER
  122.                    MOV         AX,0         ;CLEAR THE REG
  123.                    MOV         AH,15        ;GET CURRENT VIDEO MODE
  124.                    INT         10H          ;VIDEO-IO
  125.                    POP         BP           ;THE FRAME POINTER
  126.                    RET
  127. GET_MODE           ENDP
  128.  
  129. ;-------------------------------------------------------------------------------
  130. ; SET_VIDEO_ADDRESS (ROUTINE 5)
  131. ;     THIS ROUTINE IS USED IN SEVERAL OF THE OTHER ROUTINES TO TEST THE VIDEO
  132. ;     MODE AND TO SET THE CORRECT VIDEO BUFFER ADDRESS (MONOCHROME OR GRAPHICS).
  133. ;     THE VIDEO BUFFER ADDRESS IS RETURNED IN AX.
  134. ;     THIS IS AN INTERNAL ROUTINE SO THE C LANGUAGE AND ASSEMBLY LANGUAGE
  135. ;     CALLS ARE NOT SHOWN IN THIS PROLOGUE.
  136. ;-------------------------------------------------------------------------------
  137. SET_VIDEO_ADDRESS  PROC      NEAR
  138.                    CALL      GET_MODE            ;GET CRT MODE
  139.                    CMP       AL,7H               ;IS IT A MONOCHROME CARD?
  140.                    JNE       ITS_GRAPHICS
  141.                    MOV       AX,MONOCHROME_SEGADR ;MONOCHROME BUFFER SEG ADDR
  142.                    JMP       RETURN
  143. ITS_GRAPHICS:      MOV       AX,GRAPHICS_SEGADR  ;GRAPHICS BUFFER SEG ADR
  144. RETURN:            RET
  145. SET_VIDEO_ADDRESS  ENDP
  146.  
  147. ;-------------------------------------------------------------------------------
  148. ; CALC_VIDEO_OFFSET   (ROUTINE 6)
  149. ;     THIS ROUTINE IS USED BY SEVERAL OF THE ROUTINES TO CALCULATE THE OFFSET
  150. ;     INTO THE VIDEO BUFFER FOR MOVING CHARACTERS INTO OR FROM THE VIDEO BUFFER.
  151. ;     DX MUST BE SET TO THE ROW, AND CX MUST BE SET TO THE COLUMN BEFORE THIS
  152. ;     ROUTINE IS EXECUTED. THE OFFSET IS RETURNED IN AX.
  153. ;     THIS IS AN INTERNAL ROUTINE SO THE C LANGUAGE AND ASSEMBLY LANGUAGE
  154. ;     CALLS ARE NOT SHOWN IN THIS PROLOGUE.
  155. ;-------------------------------------------------------------------------------
  156. CALC_VIDEO_OFFSET PROC      NEAR
  157.                   MOV       AX,NUM_BYTES_IN_ROW ;NUMBER OF BYTES IN ROW
  158.                   MUL       DX                  ;RESULT IS IN AX
  159.                   ADD       AX,CX               ;THE COL
  160.                   SHL       AX,1                ;MULTIPLY BY 2 FOR CHAR/ATTR
  161.                   RET
  162. CALC_VIDEO_OFFSET ENDP
  163.  
  164. ;-------------------------------------------------------------------------------
  165. ; ISRTSTR         (ROUTINE 7)
  166. ;       THIS ROUTINE POSITIONS ITSELF IN THE VIDEO BUFFER, THEN INSERTS A
  167. ;       NULL-TERMINATED STRING, ALONG WITH AN ATTRIBUTE, DIRECTLY INTO THE VIDEO
  168. ;       BUFFER
  169. ; THE C LANGUAGE CALL IS:  ISRTSTR(ROW,COL,STRING,ATTR);
  170. ; THE ASSEMBLY CALL IS:
  171. ;        MOV    DX,ATTRIBUTE   ;THE ATTRIBUTE BYTE (VALUE OF NORMAL IS 7)
  172. ;        PUSH   DX
  173. ;        LEA    DX,STRING      ;GET ADDRESS OF THE STRING
  174. ;        PUSH   DX
  175. ;        MOV    DX,COL         ;RANGE IS 0 - 79
  176. ;        PUSH   DX
  177. ;        MOV    DX,ROW         ;RANGE IS 0 - 24
  178. ;        PUSH   DX
  179. ;        CALL   ISRTSTR
  180. ;-------------------------------------------------------------------------------
  181.                    PUBLIC    ISRTSTR
  182. ISRTSTR            PROC      NEAR
  183.  
  184.                    PUSH      ES
  185.  
  186.                    PUSH      BP                  ;THE FRAME POINTER
  187.                    MOV       BP,SP               ;POINT TO STACK
  188.  
  189.                    MOV       DX,[BP+6]           ;GET THE ROW
  190.                    MOV       CX,[BP+8]           ;GET THE COLUMN
  191.                    CALL      CALC_VIDEO_OFFSET   ;CALC OFFSET INTO VIDEO BUFFER
  192.                    MOV       DI,AX               ;OFFSET WAS RETURNED IN AX
  193.  
  194.                    MOV       SI,[BP+10]          ;GET THE SOURCE STRING OFFSET
  195.                    MOV       DH,[BP+12]          ;GET THE ATTRIBUTE BYTE
  196.  
  197.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  198.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  199.  
  200. ISRT_LOOP:         MOV       DL,BYTE PTR [SI]    ;THE CHARACTER TO INSERT
  201.                    CMP       DL,0                ;IS IT END OF STRING?
  202.                    JE        ISRTSTR_EXIT        ;EXIT IF END OF STRING
  203.                    MOV       ES:WORD PTR [DI],DX ;MOVE CHAR AND ATTR TO CRT BUF
  204.                    ADD       DI,2H               ;POINT TO NEXT CRT BUF LOC
  205.                    ADD       SI,1H               ;POINT TO NEXT SORC STRING BYTE
  206.                    JMP       ISRT_LOOP           ;GO MOVE ANOTHER WORD
  207.  
  208. ISRTSTR_EXIT:      POP       BP                  ;THE FRAME POINTER
  209.                    POP       ES
  210.  
  211.                    RET
  212. ISRTSTR            ENDP
  213.  
  214. ;-------------------------------------------------------------------------------
  215. ; ISRTCNT          (ROUTINE 8)
  216. ;        THIS ROUTINE POSITIONS ITSELF IN THE VIDEO BUFFER, THEN INSERTS
  217. ;        N BYTES FROM AN ARRAY DIRECTLY INTO THE VIDEO BUFFER, ALONG WITH AN
  218. ;        ATTRIBUTE BYTE
  219. ; THE C LANGUAGE CALL IS:
  220. ;        ISRTCNT(ROW,COL,STRING,ATTR,NUM_BYTES);
  221. ; THE ASSEMBLY CALL IS:
  222. ;        MOV    DX,NUM_BYTES      ;THE NUMBER OF BYTES TO BE DISPLAYED
  223. ;        PUSH   DX
  224. ;        MOV    DX,ATTRIBUTE      ;THE ATTRIBUTE BYTE (NORMAL VALUE IS 7)
  225. ;        PUSH   DX
  226. ;        LEA    DX,ARRAY          ;GET THE CHARACTER ARRAY ADDRESS
  227. ;        PUSH   DX
  228. ;        MOV    DL,COL            ;RANGE IS 0 - 79
  229. ;        PUSH   DX
  230. ;        MOV    DL,ROW            ;RANGE IS 0 - 24
  231. ;        PUSH   DX
  232. ;        CALL   ISRTCNT
  233. ;-------------------------------------------------------------------------------
  234.                    PUBLIC    ISRTCNT
  235. ISRTCNT            PROC      NEAR
  236.  
  237.                    PUSH      ES
  238.  
  239.                    PUSH      BP                  ;THE FRAME POINTER
  240.                    MOV       BP,SP               ;POINT TO STACK
  241.  
  242.                    MOV       DX,[BP+6]           ;GET THE ROW
  243.                    MOV       CX,[BP+8]           ;GET THE COLUMN
  244.                    CALL      CALC_VIDEO_OFFSET   ;CALC OFFSET INTO VIDEO BUFFER
  245.                    MOV       DI,AX               ;OFFSET WAS RETURNED IN AX
  246.  
  247.                    MOV       SI,[BP+10]          ;GET THE SOURCE STRING OFFSET
  248.                    MOV       DH,[BP+12]          ;GET THE ATTRIBUTE BYTE
  249.                    MOV       CX,[BP+14]          ;GET NUMBER OF BYTES TO INSERT
  250.  
  251.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  252.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  253.  
  254. ISRTCNT_LOOP:      MOV       DL,BYTE PTR [SI]    ;THE CHARACTER TO INSERT
  255.                    MOV       ES:WORD PTR [DI],DX ;MOVE CHAR AND ATTR TO CRT BUF
  256.                    ADD       DI,2H               ;POINT TO NEXT CRT BUF LOC
  257.                    ADD       SI,1H               ;POINT TO NEXT SORC STRING BYTE
  258.                    LOOP      ISRTCNT_LOOP        ;GO MOVE ANOTHER WORD
  259.  
  260. ISRTCNT_EXIT:      POP       BP                  ;THE FRAME POINTER
  261.                    POP       ES
  262.  
  263.                    RET
  264. ISRTCNT            ENDP
  265.  
  266. ;-------------------------------------------------------------------------------
  267. ; PUTCHAT          (ROUTINE 9)
  268. ;     WRITES A CHARACTER AND ATTRIBUTE TO THE SCREEN. THE CURSOR DOES NOT MOVE.
  269. ; THE C LANGUAGE CALL IS:  PUTCHAT(CHARACTER,ATTR);
  270. ; THE ASSEMBLY LANGUAGE CALL IS:
  271. ;         MOV    DX,0
  272. ;         MOV    DL,CHARACTER      ;THE CHARACTER TO BE DISPLAYED
  273. ;         PUSH   DX
  274. ;         MOV    DL,ATTRIBUTE      ;THE ATTRIBUTE TO BE DISPLAYED
  275. ;         PUSH   DX
  276. ;         CALL   PUTCHAT
  277. ;-------------------------------------------------------------------------------
  278.                    PUBLIC    PUTCHAT
  279. PUTCHAT            PROC      NEAR
  280.                    PUSH      BP                  ;THE FRAME POINTER
  281.                    MOV       BP,SP               ;POINT TO STACK
  282.                    MOV       AL,[BP+4]           ;THE CHARACTER
  283.                    MOV       BL,[BP+6]           ;THE ATTRIBUTE
  284.                    MOV       BH,0H               ;DISPLAY PAGE #
  285.                    MOV       CX,1H               ;NUMBER OF CHARACTERS TO WRITE
  286.                    MOV       AH,9H               ;WRITE CHAR/ATTR AT CURPOS
  287.                    INT       10H                 ;VIDEO_IO
  288.                    POP       BP                  ;THE FRAME POINTER
  289.                    RET
  290. PUTCHAT    ENDP
  291.  
  292. ;-------------------------------------------------------------------------------
  293. ; CRTBUF           (ROUTINE 10)
  294. ;       ACCEPTS TWO PARAMETERS:
  295. ;          1.   SAVE = 0 AND REPLACE = 1.
  296. ;          2.   THE ADDRESS TO SAVE THE VIDEO BUFFER INTO OR REPLACE THE VIDEO
  297. ;               BUFFER FROM
  298. ;       CALLS CRTSAVE TO SAVE THE CRT BUFFER,
  299. ;       CALLS CRTREPL TO REPLACE THE CRT BUFFER.
  300. ; THE C LANGUAGE CALL IS: CRTBUF(SAVE,SAVE_AREA); OR CRTBUF(REPLACE,SAVE_AREA);
  301. ; THE ASSEMBLY CALL IS:
  302. ;            LEA  DX,SAVE_AREA ;GET ADDRESS OF SAVE_AREA
  303. ;            PUSH DX
  304. ;            MOV  DX,0         ;SAVE (MOV DX,1 TO REPLACE)
  305. ;            PUSH DX
  306. ;            CALL CRTBUF
  307. ;-------------------------------------------------------------------------------
  308.                    PUBLIC    CRTBUF
  309. CRTBUF             PROC      NEAR
  310.                    PUSH      BP                  ;THE FRAME POINTER
  311.                    MOV       BP,SP               ;POINT TO STACK
  312.  
  313.                    MOV       DX,[BP+4]           ;SAVE/RESTORE INDICATOR
  314.                    CMP       DX,0                ;SAVE THE CRT BUFFER?
  315.                    JNE       RESTORE_IT
  316. SAVE_IT:           CALL      CRTSAVE
  317.                    JMP       CRTBUF_EXIT
  318. RESTORE_IT:        CALL      CRTREPL
  319.  
  320. CRTBUF_EXIT:       POP       BP                  ;THE FRAME POINTER
  321.  
  322.                    RET
  323. CRTBUF             ENDP
  324.  
  325. ;-------------------------------------------------------------------------------
  326. ; CRTSAVE          (ROUTINE 11)
  327. ;      THIS ROUTINE IS CALLED BY CRTBUF TO SAVE THE CRT BUFFER INTO A SAVE AREA.
  328. ;
  329. ;-------------------------------------------------------------------------------
  330. CRTSAVE            PROC      NEAR
  331.  
  332.                    PUSH      ES                  ;ES AND DS ARE MODIFIED..
  333.                    PUSH      DS                  ;..SO SAVE THEM
  334.  
  335.                    PUSH      BP                  ;SAVE THE FRAME POINTER
  336.                    MOV       BP,SP               ;ADDRESS THE STACK
  337.  
  338.                    MOV       CX,DS               ;DATA SEG IS THE DESTINATION
  339.                    MOV       ES,CX               ;ES HAS DESTINATION SEG ADDR
  340.                    MOV       DI,[BP+14]          ;DESTINATION OFFSET
  341.  
  342.                    MOV       CX,BUFFER_SIZE      ;THE BUFFER SIZE IN WORDS
  343.  
  344.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  345.                    MOV       DS,AX               ;..VIDEO BUFFER ADDRESS INTO DS
  346.  
  347.                    MOV       SI,0                ;SOURCE OFFSET
  348.  
  349.                    CLD                           ;SET DF=0 TO MOVE FORWARD
  350. REP                MOVSW                         ;MOVE 2000 WORDS
  351.                                                  ;THE FRAME POINTER
  352.                    POP       BP                  ;MUST RESTORE DS..
  353.                    POP       DS                  ;..AND ES
  354.                    POP       ES
  355.                    RET
  356. CRTSAVE            ENDP
  357.  
  358. ;-------------------------------------------------------------------------------
  359. ; CRTREPL          (ROUTINE 12)
  360. ;   THIS ROUTINE IS CALLED BY CRTBUF TO REPLACE THE CRT BUFFER FROM A SAVE AREA.
  361. ;
  362. ;-------------------------------------------------------------------------------
  363. CRTREPL            PROC      NEAR
  364.  
  365.                    PUSH      ES                  ;ES IS MODIFIED, SO SAVE IT
  366.  
  367.                    PUSH      BP                  ;SAVE THE FRAME POINTER
  368.                    MOV       BP,SP               ;ADDRESS THE STACK
  369.  
  370.                    MOV       SI,[BP+12]          ;SOURCE OFFSET
  371.  
  372.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  373.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  374.  
  375.                    MOV       DI,0                ;DESTINATION OFFSET
  376.  
  377.                                                  ;DS HAS SOURCE SEG ADDR
  378.                    MOV       CX,BUFFER_SIZE      ;THE BUFFER SIZE IN WORDS
  379.  
  380.                    CLD                           ;SET DF=0 TO MOVE FORWARD
  381. REP                MOVSW                         ;MOVE 2000 WORDS
  382.  
  383.                    POP       BP                  ;THE FRAME POINTER
  384.                    POP       ES                  ;MUST RESTORE ES
  385.                    RET
  386. CRTREPL            ENDP
  387.  
  388. ;-------------------------------------------------------------------------------
  389. ; SCANCRT          (ROUTINE 13)
  390. ;   POSITIONS ITSELF IN THE CRT BUFFER, THEN MOVES N BYTES, NOT NULL-TERMINATED,
  391. ;   TO THE ADDRESS OF AN ARRAY PROVIDED BY THE CALLER.
  392. ;
  393. ; THE C LANGUAGE CALL IS:  SCANCRT(ROW,COL,STRING,NUM_BYTES);
  394. ; THE ASSEMBLY CALL IS:
  395. ;        MOV    DX,NUM_BYTES        ;THE NUMBER OF BYTES TO MOVE
  396. ;        PUSH   DX
  397. ;        LEA    DX,ARRAY            ;GET CHARACTER ARRAY ADDRESS
  398. ;        PUSH   DX
  399. ;        MOV    DX,COL              ;RANGE IS 0 - 79
  400. ;        PUSH   DX
  401. ;        MOV    DX,ROW              ;RANGE IS 0 - 24
  402. ;        PUSH   DX
  403. ;        CALL   SCANCRT
  404. ;-------------------------------------------------------------------------------
  405.                    PUBLIC    SCANCRT
  406. SCANCRT            PROC      NEAR
  407.  
  408.                    PUSH      ES                  ;ES IS MODIFIED, SO SAVE IT
  409.  
  410.                    PUSH      BP                  ;THE FRAME POINTER
  411.                    MOV       BP,SP               ;POINT TO STACK
  412.  
  413.                    MOV       DX,[BP+6]           ;GET THE ROW
  414.                    MOV       CX,[BP+8]           ;GET THE COLUMN
  415.                    CALL      CALC_VIDEO_OFFSET   ;CALC OFFSET INTO VIDEO BUFFER
  416.                    MOV       DI,AX               ;OFFSET WAS RETURNED IN AX
  417.  
  418.                    MOV       SI,[BP+10]          ;GET THE SOURCE STRING OFFSET
  419.                    MOV       CX,[BP+12]          ;NUMBER OF BYTES TO MOVE
  420.  
  421.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  422.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  423.  
  424. SCAN_LOOP:         MOV       DL,ES:BYTE PTR [DI] ;GET CHAR FROM CRT BUFFER
  425.                    MOV       BYTE PTR[SI],DL     ;MOVE CHAR TO STRING IN CALLER
  426.                    ADD       DI,2H               ;POINT TO NEXT CRT_BUF LOC
  427.                    ADD       SI,1H               ;POINT TO NEXT DEST STRING BYTE
  428.                    LOOP      SCAN_LOOP
  429.  
  430. SCANCRT_EXIT:      POP       BP                  ;THE FRAME POINTER
  431.                    POP       ES                  ;MUST RESTORE ES
  432.  
  433.                    RET
  434. SCANCRT            ENDP
  435.  
  436.  
  437. PROG               ENDS
  438.                    END
  439.